package com.linkage.usercenter.controller;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.linkage.common.base.RequestInfo;
import com.linkage.common.base.ResponseInfo;
import com.linkage.common.exception.ServiceException;
import com.linkage.common.util.OSSUtils;
import com.linkage.common.util.RedisUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    @Resource
    private RedisUtils redisUtils;

    /**
     * 上传文件
     * @param files
     * @param folder
     * @return
     */
    @RequestMapping(value = "/upload",headers = "content-type=multipart/form-data")
    public String uploadFiles(@RequestParam("files")MultipartFile[] files,@RequestParam("folder")String folder){
        List urlList =  OSSUtils.uploadFileSingle(files, folder);
        return ResponseInfo.success(MapUtil.builder().put("list",urlList).build()).toString();
    }

    /**
     * 发送短信
     * @param param
     * @return
     */
    @PostMapping("/sendSMS")
    public String sendSMS(@RequestBody RequestInfo<Map<String, String>>param){
        if(!param.getBuss().containsKey("phone")){
            throw new ServiceException(500,"发送短信-手机号为空");
        }
        String phone = "+86"+param.getBuss().get("phone");
        String verifiCode = RandomUtil.randomNumbers(6);
        // 发送短信，对接腾讯云
        String[] smsParam = {verifiCode,"3"};
        String[] phones = {phone};
        try {
            send(phones,smsParam);
            redisUtils.set("verifiCode:"+phone,verifiCode,180);
        }catch (TencentCloudSDKException e){
            log.error("发送信息错误：【{}】",e.toString());
            return ResponseInfo.error("发送信息错误：【"+e.toString()+"】").toString();
        }
        return ResponseInfo.success("发送短信成功！").toString();
    }

    private void send(String[] phone,String[] param) throws TencentCloudSDKException{
        final String secretId = "AKIDsiPVLveXx6yaw0417xVmJIzPbXCatPpz";
        final String secretKey= "26FqNddO7anvmNhlZmiT7VdT2f290auV";
        //短信应用 ID
        final String appid = "1400407129";
        //短信签名内容
        final String sign = "山东领迅";
        //短信模板 ID
        final String templateID = "605123";
        //+86为国家码，182********为手机号，最多不要超过200个手机号
        //模板参数: 若无模板参数，则设置为空
        String[] templateParams = param;//对应模板中{1}
        //必要步骤： 实例化一个认证对象，入参需要传入腾讯云账户密钥对 secretId 和 secretKey
        Credential cred = new Credential(secretId , secretKey);

        ClientProfile clientProfile = new ClientProfile();
        //SDK 默认用 TC3-HMAC-SHA256 进行签名 非必要请不要修改该字段

        clientProfile.setSignMethod("HmacSHA256");
        // 实例化 SMS 的 client 对象 第二个参数是地域信息，可以直接填写字符串 ap-guangzhou，或者引用预设的常量
        SmsClient client = new SmsClient(cred, "", clientProfile);
        //实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
        SendSmsRequest req = new SendSmsRequest();

        // 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID，例如1400006666
        req.setSmsSdkAppid(appid);

        // 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息
        req.setSign(sign);

        //短信模板 ID: 必须填写已审核通过的模板 ID，可登录 [短信控制台] 查看模板 ID
        req.setTemplateID(templateID);

        //下发手机号码，采用 e.164 标准，+[国家或地区码][手机号] 例如+8613711112222
        req.setPhoneNumberSet(phone);

        req.setTemplateParamSet(templateParams);

        // 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 返回的 res 是一个SendSmsResponse 类的实例，与请求对象对应
        SendSmsResponse res = client.SendSms(req);

        // 输出 JSON 格式的字符串回包
       log.info(SendSmsResponse.toJsonString(res));

       if(!StrUtil.equals("Ok",res.getSendStatusSet()[0].getCode())){
            throw new TencentCloudSDKException(res.getSendStatusSet()[0].getMessage());
       }

        // 可以取出单个值，您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
//        System.out.println(res.getRequestId());
    }
}
